/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo1.clases;

import org.joda.time.LocalDate;

/**
 * Clase Reserva, que identifica la reserva de un trayecto, entre dos ciudades a una hora dada.
 * @author Alejandro & David
 */
public class Reserva {
    static int identificador = 1000;
    private int idReserva;
    private String fechaReserva;
    private InformacionReserva informacionReserva;
    private int asiento;
    RepartoAsientos repartoAsientos;

   // private ReservaAsiento reservaAsiento;

    /**
     * Constructor de la clase Reserva, que instancia una reserva..
     * @param informacionReserva instancia de la clase hora, que posee todos los datos del viaje.
     * @param repartoAsientos criterio para la asignación de los asientos.
     */
    public Reserva(InformacionReserva informacionReserva,RepartoAsientos repartoAsientos){
        this.fechaReserva = (new LocalDate()).toString();
        this.informacionReserva = informacionReserva;
        this.idReserva = identificador;
        identificador = identificador + 1;
        this.repartoAsientos=repartoAsientos;
        this.asiento=this.repartoAsientos.insertaAsiento(this.idReserva,this.informacionReserva.obtieneAsientos());
        //this.asiento = hora.asientoLibre();
        //hora.modificaAsiento(this.asiento);
    }
    /**
     * Función que devuelve el objeto InformacionReserva asociado a la reserva.
     * @return la hora del trayecto de la reserva.
     */
    public InformacionReserva obtieneInformacionReserva(){
        return this.informacionReserva;
    }
    /**
     * Función que devuelve el código de reserva de una reserva.
     * @return el código de reserva.
     */
    public String obtieneCodigoReserva (){
        return Integer.toString(this.idReserva);
    }
    /**
     * Función que devuelve el asiento reservado.
     * @return un entero con el número del asiento.
     */
    public int obtieneAsiento(){
        return this.asiento;
    }
    /**
     * Funcion que devuelve si un trayecto posee plazas libres, segun la reserva.
     * @param fechaViaje es la fecha en la que se realiza el viaje.
     * @param hora es la hora del trayecto con el medio de transporte reservado, en la fecha indicada.
     * @return Devuelve false si esa hora no posee plazas libres, o true si posee
     * plazas libres.
     */
    public boolean horaDisponible (LocalDate fechaViaje, Hora hora){
        if(this.informacionReserva.comparaInformacionReserva(hora,fechaViaje)){
            if(this.informacionReserva.numeroAsientosLibres() == 0){
                return false;
            }else{
                return true;
            }
        }else{
            return true;
        }
    }
    /**
     * Función que deja libre el asiento de una reserva cancelada.
     */
    public void cancelaAsientoReserva(){
        this.repartoAsientos.cancelaAsiento(this.informacionReserva.obtieneAsientos(), this.asiento);
    }
}
